//基类和子类构造函数的几种情况  
#ifdef a

//当基类没有显性定义构造函数或者定义无参构造函数/全缺省构造函数时，子类构造函数进行显性定义与否并不影响
//当基类中进行了构造函数的显性定义时，其子类的构造函数中也必须进行构造函数的显性定义，并在其初始化列表中
	//对基类构造函数进行显性调用以初始化基类继承下来的成员

//子类右两部分组成，一部分是基类继承而来，一部分是自己的个性，在创建子类对象时，首先要进行基类继承成员的初始化
//然后再进行自身其它成员的初始化，而在基类构造函数无需参数时，编译器会在子类默认的构造函数初始化列表中自动调用基类的构造函数

//注意，构造函数在某些情况下也是可以且需要显性构造的，如这里。
#include<iostream>
using namespace std;

#ifdef a
//第一种情况（基类无显性构造函数，不包括无参和全缺省）
class Base {
public:
	//无参
	/*
	Base() {
		_b = 0;
	}
	//没问题
	*

	//全缺省
	/*
	Base(int b = 0)
		:_b(0)
	{}
	//没问题
	*/
	int _b;
};

class Child :public Base
{
public:
	int _d;
};
int main() {
	Child d;
	return 0;
}

#endif 

#ifdef a
class Base {
public:
	Base(int b)
		:_b(b)
	{}
public:
	int _b;
};

class Child :public Base
{
	//基类中有显性定义，需要在子类中进行显性定义构造函数，并在初始化列表中对从基类继承下来的成员初始化
public:
	Child()
		:_d(5)
		,Base(100)//无法自动初始化
		//这里的顺序不管写成什么，一定先进行的是基类的初始化，其次才是自身的初始化
	{}
	int _d;
};
int main() {
	Child d;
	return 0;
}
#endif
//子类中调用基类构造函数对继承下来的成员进行初始化时，初始化顺序是什么（先调用基类？）--》对的

//构造函数不是不可以显性调用吗？子类初始化列表中算什么？
//某些情况下可以调用，初始化列表中/new。。。。。。
#endif